package com.xlh.service.user;

import com.xlh.dto.PageDTO;
import com.xlh.dto.course.ClassZtreeDTO;
import com.xlh.dto.course.CourseDTO;
import com.xlh.dto.user.*;
import com.xlh.param.course.ClassCourseParam;
import com.xlh.param.user.CreateUserParam;
import com.xlh.param.user.UpdateClassParam;
import com.xlh.pojo.user.Class;
import com.xlh.pojo.user.ClassCourse;

import java.util.List;

/**
 * 班级
 * <p>
 * Created by lx on 2019/1/28.
 */
public interface ClassService {

    /**
     * 根据课程id、年级、结课标识，获取班级课程信息
     *
     * @param courseId 课程id 必须传
     * @param userId   教师id
     * @param grade    年级
     * @param endFlag  结课标识
     * @param name     班级名称
     * @return
     */
    List<ClassDTO> listClassCourse(Long courseId, Long userId, String grade, Boolean endFlag, String name);

    /**
     * 获取班级课程信息
     *
     * @param courseId 课程id
     * @param grade    年级
     * @param endFlag  结课标识
     * @param name     班级名称
     * @return
     */
    List<ClassDTO> listClassCourse(Long courseId, String grade, Boolean endFlag, String name);

    /**
     * 获取联动搜索框的数据
     *
     * @param courseId         课程id
     * @param allFlag          全部的标识
     * @param defaultClassFlag 默认班级标识
     * @return
     */
    List<ClassZtreeDTO> queryClassCourse(Long courseId, Boolean allFlag, Boolean defaultClassFlag);

    /**
     * 获取班级信息
     *
     * @param classId 班级id
     * @return
     */
    Class queryClass(Long classId);

    /**
     * 获取课程集合的班级关联关系
     *
     * @param courseIds 课程id集合
     * @param endFlag   结课状态 true：已结课 false：未结课
     * @return
     */
    List<ClassCourseDTO> listClassCourse(List<Long> courseIds, Boolean endFlag);

    /**
     * 获取班级分页列表
     *
     * @param pageNum  当前页
     * @param pageSize 每页展示数量
     * @param courseId 课程id
     * @param endFlag  结课标识
     * @param grade    年级
     * @return
     */
    PageDTO<ClassInfoDTO> listClassByPage(Integer pageNum, Integer pageSize,
                                          Long courseId, Boolean endFlag, String grade);

    /**
     * 修改默认班级
     *
     * @param courseId 课程id
     * @param classId  班级id
     * @return
     */
    void updateDefaultClass(Long courseId, Long classId);

    /**
     * 获取默认班级
     *
     * @param courseId 课程id
     * @return
     */
    Class getDefaultClass(Long courseId);

    /**
     * 获取默认班级
     *
     * @param courseId 课程id
     * @param userId   用户id
     * @return
     */
    Class getDefaultClass(Long courseId, Long userId);

    /**
     * 删除默认班级
     *
     * @param courseId 课程id
     * @param classId  班级id
     */
    void deleteDefaultClass(Long courseId, Long classId);

    /**
     * 获取教师全部未结课班级
     *
     * @param userId  教师id
     * @param endFlag 结课标识
     * @return
     */
    List<Class> getTeacherClass(Long userId, Boolean endFlag);

    /**
     * 获取教师全部班级id
     *
     * @param userId  教师id
     * @param endFlag 结课标识
     * @return
     */
    List<Long> getTeacherClassId(Long userId, Boolean endFlag);

    /**
     * 获取教师教授的班级
     *
     * @param userId   用户id
     * @param endFlag  结课标识
     * @param classId  班级id
     * @param courseId 课程id
     * @return
     */
    List<ClassCourse> listTeacherClass(Long userId, Boolean endFlag, Long classId, Long courseId);

    /**
     * 根据班级集合获取用户班级
     *
     * @param courseIds 课程id集合
     * @return
     */
    List<CourseClassDTO> queryUserClass(List<Long> courseIds);

    /**
     * 根据班级id集合获取班级信息
     *
     * @param classIds 班级id集合
     * @param deleted  删除状态
     * @return
     */
    List<Class> listClass(List<Long> classIds, Boolean deleted);

    /**
     * 根据当前课程id获取班级课程信息
     *
     * @param courseId 课程id
     * @param deleted  是否删除
     * @return
     */
    List<ClassCourse> listClassCourse(Long courseId, Boolean deleted);

    /**
     * 获取历史班级详情
     *
     * @param classInfo 班级详情
     * @param userId    用户id
     * @return
     */
    List<UserClassDTO> queryHistoryClass(String classInfo, Long userId);

    List<UserClassDTO> queryHistoryClass(String classInfo, Long userId, String falg);

    /**
     * 创建班级
     *
     * @param courseId         课程id
     * @param createUserParams 创建参数
     * @param studentclassId   导入学生的班级id
     * @param name             名称
     * @param grade            年级
     * @param errorFlag        用户对错误提示作出的决定 true：继续导入 false：过滤 null：没有作出决定
     * @param userId           教师id
     * @return 课程id
     */
    Long createClass(Long courseId, List<CreateUserParam> createUserParams,
                     Long studentclassId, String name, Integer grade, Boolean errorFlag, Long userId, List<Long> studentIds);


    /**
     * 添加班级
     *
     * @param courseId       课程id
     * @param studentClassId 导入学生的班级id
     * @param errorFlag      用户对错误提示作出的决定 true：继续导入 false：过滤 null：没有作出决定
     * @param userId         教师id
     * @return
     */
    Long createClass(Long courseId, Long studentClassId, Boolean errorFlag, Long userId);

    /**
     * 创建班级
     *
     * @param classObj   班级信息
     * @param userParams 用户参数
     * @return 班级id
     */
    Long createClass(Class classObj, List<CreateUserParam> userParams);

    /**
     * 创建班级用户
     *
     * @param courseIds        课程id集合
     * @param createUserParams 用户参数
     * @param studentClassId   学生的班级id
     * @param errorFlag        错误标识
     * @param userId           用户id
     */
    void createClassUser(List<Long> courseIds, List<CreateUserParam> createUserParams,
                         Long studentClassId, Boolean errorFlag, Long userId);

    /**
     * 创建课程班级
     *
     * @param courseInfos    课程id信息
     * @param studentclassId 导入学生的班级id
     * @param userId         教师id
     * @return 新课程id
     */
    List<Long> createCourseClass(List<CourseDTO> courseInfos, Long studentclassId, Long userId);


    /**
     * 创建学生的班级关联关系
     *
     * @param classId 班级id
     * @param userIds 用户id集合
     */
    void createUserClass(Long classId, List<Long> userIds);

    /**
     * 修改班级
     *
     * @param courseId         课程id
     * @param classId          班级id
     * @param updateClassParam 修改参数
     */
    void updateClass(Long courseId, Long classId, UpdateClassParam updateClassParam);

    void updateNaturalClass(Long courseId, Long classId, UpdateClassParam updateClassParam);

    /**
     * 批量删除班级
     *
     * @param courseId     课程id
     * @param classIds     班级id集合
     * @param errorFlag    错误提示 true：继续结课 null：没有作出决定
     * @param logicDeleted 是否逻辑删除 true：逻辑删除 false：真删除
     */
    void deleteBatchClass(Long courseId, List<Long> classIds, Boolean errorFlag, Boolean logicDeleted);

    void deleteNaturalBatchClass(List<Long> classIds, Boolean errorFlag, Boolean logicDeleted);

    /**
     * 对某课程、某班级进行结课
     *
     * @param courseId  课程id
     * @param classId   班级id
     * @param errorFlag 错误提示 true：继续结课 null：没有作出决定
     */
    void endClass(Long courseId, Long classId, Boolean errorFlag);

    /**
     * 获取学生分页数据
     *
     * @param pageNum  当前页
     * @param pageSize 每页显示条数
     * @param classId  班级id
     * @param userInfo 用户信息
     * @return
     */
    PageDTO<UserInfoDTO> listStudentByPage(Integer pageNum, Integer pageSize, Long classId, String userInfo);

    /**
     * 班級信息
     *
     * @param classId 班级id
     * @return
     */
    String queryClassInfoFlag(Long classId);

    /**
     * 获取班级课程信息（不管是否结课）
     *
     * @param classIds 班级id集合
     * @return
     */
    List<ClassCourseDTO> queryClassCourse(List<Long> classIds);

    /**
     * 获取班级课程信息
     *
     * @param courseIds 课程id集合
     * @param ended     是否结课
     * @param grade     年级
     * @param name      班级名称
     * @param ids       班级id集合
     * @return
     */
    List<ClassCourseDTO> listClassCourse(List<Long> courseIds, Boolean ended, String grade, String name, List<Long> ids);

    /**
     * 获取教师的班级信息
     *
     * @param userIds 教师id集合
     * @return
     */
    List<Class> queryClass(List<Long> userIds);

    /**
     * 获取班级信息
     *
     * @param classIds 班级id集合
     * @return
     */
    List<Class> queryClassByIds(List<Long> classIds);

    /**
     * 获取某个课程下学生班级集合
     *
     * @param courseId 课程id
     * @param endFlag  结课标识
     * @return
     */
    List<Long> queryStudentClass(Long courseId, Boolean endFlag);

    /**
     * 获取自然班级信息
     *
     * @param id 班级id
     * @return
     */
    PageDTO<ClassInfoDTO> queryClassInfo(Integer pageNum, Integer pageSize, String grade, String classInfo);

    /**
     * 获取自然班级年级
     *
     * @return
     */
    List<String> queryNaturalClassInfo();


    void saveClassInfo(ClassCourseParam params);

}
